// #include <linux/can.h>
// #include <linux/can/raw.h>
// #include <stdio.h>
// #include <stdlib.h>
// #include <string.h>
// #include <sys/socket.h>
// #include <unistd.h>

// int main() {
//     int s, nbytes;
//     struct sockaddr_can addr;
//     struct ifreq ifr;
//     struct can_frame frame;

//     // 打开原始CAN套接字
//     if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
//         perror("socket");
//         return 1;
//     }

//     // 选择一个CAN接口（例如 "can0"）
//     strcpy(ifr.ifr_name, "can0");
//     if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
//         perror("ioctl");
//         return 1;
//     }

//     addr.can_family = AF_CAN;
//     addr.can_ifindex = ifr.ifr_ifindex;

//     // 绑定到CAN接口
//     if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
//         perror("bind");
//         return 1;
//     }

//     // 设置CAN帧
//     frame.can_id = 0x123;  // CAN标识符
//     frame.can_dlc = 2;     // 数据长度
//     frame.data[0] = 0x01;  // 数据字节1
//     frame.data[1] = 0x23;  // 数据字节2

//     // 发送CAN帧
//     if (write(s, &frame, sizeof(frame)) < 0) {
//         perror("write");
//         return 1;
//     }

//     // 接收CAN帧
//     while ((nbytes = read(s, &frame, sizeof(frame))) > 0) {
//         // 处理接收到的CAN帧
//         printf("Received CAN frame: ID=%x, DLC=%d, Data=%02x %02x\n", frame.can_id, frame.can_dlc,
//                frame.data[0], frame.data[1]);
//     }

//     if (nbytes < 0) {
//         perror("read");
//         return 1;
//     }

//     // 关闭套接字
//     close(s);

//     return 0;
// }
// https://blog.csdn.net/w1245247503/article/details/136319277
#include <linux/can.h>
#include <linux/can/raw.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <unistd.h>
#include <cstring>
#include <iostream>

int main() {
    int s;
    struct sockaddr_can addr;
    struct ifreq ifr;
    struct can_frame frame;
    const char* ifname = "can0";  // 你的CAN接口名称

    // 创建socket
    if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
        perror("Error while opening socket");
        return -1;
    }

    // 设置CAN接口名称
    std::strcpy(ifr.ifr_name, ifname);
    if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
        perror("Error getting interface index");
        close(s);
        return -1;
    }

    // 绑定socket到CAN接口
    addr.can_family = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;
    if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        perror("Error binding socket");
        close(s);
        return -1;
    }

    // 写入数据示例：
    frame.can_id = 0x123;  // CAN标识符
    frame.can_dlc = 2;     // 数据长度
    frame.data[0] = 0x11;  // 数据字节1
    frame.data[1] = 0x22;  // 数据字节2
    std::cout << "Sending CAN frame..." << std::endl;
    if (write(s, &frame, sizeof(struct can_frame)) < 0) {
        perror("Error writing to socket");
    } else {
        std::cout << "CAN frame sent" << std::endl;
    }

    // 现在你可以阻塞地读取和写入数据了
    // 读取数据示例：
    int nbytes;
    std::cout << "Waiting for CAN frame..." << std::endl;
    while ((nbytes = read(s, &frame, sizeof(struct can_frame))) > 0) {
        std::cout << "Received CAN frame with data: " << std::hex << (int)frame.data[0]
                  << std::endl;
    }

    if (nbytes < 0) {
        perror("Error writing to socket");
        return 1;
    }

    // 关闭socket
    close(s);

    return 0;
}